//题目:
// 机器人在一个无限大小的 XY 网格平面上行走，从点 (0, 0) 处开始出发，面向北方。该机器人可以接收以下三种类型的命令 commands ：
// -2 ：向左转 90 度
// -1 ：向右转 90 度
// 1 <= x <= 9 ：向前移动 x 个单位长度
// 在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位于网格点  obstacles[i] = (xi, yi) 。
// 机器人无法走到障碍物上，它将会停留在障碍物的前一个网格方块上，并继续执行下一个命令。
// 返回机器人距离原点的 最大欧式距离 的 平方 。（即，如果距离为 5 ，则返回 25 ）

// 注意：
// 北方表示 +Y 方向。
// 东方表示 +X 方向。
// 南方表示 -Y 方向。
// 西方表示 -X 方向。
// 原点 [0,0] 可能会有障碍物。
#include<iostream>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) 
    {
        int ret=0;

        pair<int,int> dir(0,1);//机器人面向哪里
        pair<int,int> pos(0,0);//机器人当前的位置

        set<pair<int,int>> hash;
        for(int i=0;i<obstacles.size();i++)
            hash.insert(make_pair(obstacles[i][0],obstacles[i][1]));

        for(auto x:commands)
        {
            if(x==-1) 
            {
                if(dir.first==0 && dir.second==1) dir.first=1,dir.second=0;
                else if(dir.first==1 && dir.second==0) dir.first=0,dir.second=-1;
                else if(dir.first==0 && dir.second==-1) dir.first=-1,dir.second=0;
                else if(dir.first==-1 && dir.second==0) dir.first=0,dir.second=1;
            }
            else if(x==-2)
            {
                if(dir.first==0 && dir.second==1) dir.first=-1,dir.second=0;
                else if(dir.first==1 && dir.second==0) dir.first=0,dir.second=1;
                else if(dir.first==0 && dir.second==-1) dir.first=1,dir.second=0;
                else if(dir.first==-1 && dir.second==0) dir.first=0,dir.second=-1;
            }
            else
            {
                //机器人开始行走，走x步，或者碰到了障碍物
                for(int i=0;i<x;i++)
                {
                    if(hash.count({pos.first+dir.first,pos.second+dir.second})) break;
                    pos.first+=dir.first;
                    pos.second+=dir.second;
                }
                //走完之后，更新ret
                ret=max(ret,pos.first*pos.first+pos.second*pos.second);
            }
        }
        return ret;
    }
};